#ifndef _DYNAMIC_ARRAY_H_
#define _DYNAMIC_ARRAY_H_


/*****************  动态数组结构定义(dynamic_array)    *****************/
// 动态数组定义
typedef struct dynamic_array_t {

    // 成员变量定义
    char*   mem_start;              // 占用空间的起始地址
    char*   mem_end;                // 占用空间的结束地址
    char*   now_point;              //  当前地址
    unsigned char   max_dimension;  //  当前数组最大维度
    unsigned int*   dimension;      //  每一个维度的取值（一维数组x的限制就是dimension[0]，二维数组中y的限制就是dimension[1]）

    // 初始化标志
    char    init_flag;

    /***    成员函数定义    ***/ 
    // 1.获取占用空间的大小
    unsigned int (*get_mem_size)(struct dynamic_array_t* dynamic_array);

}dynamic_array_t;

/*****************  动态数组操作相关函数    *****************/
/****************************************************************
 *  函数功能:   动态数组初始化
 *  输入参数:
 *          dynamic_array: 需要被初始化的动态数组结构指针
 *          mem_size: 申请使用的总空间（若计算出来实际所需空间大于该参数，最终申请空间以较大值为准）
 *          max_dimension: 动态数组的最大维度
 *          dimension_one_max: 动态数组中，一维维度的最大值
 *          ... : 后续依次是动态数组中二维维度、三维维度...的最大值
 *  输出参数:
 *          dynamic_array:  初始化完成的动态数组结构指针
 *  返回值:
 *          成功返回0；
 *          失败返回小于0的错误码；
 ****************************************************************/
int dynamic_array_init(dynamic_array_t* dynamic_array, unsigned int mem_size, unsigned char max_dimension, unsigned int dimension_one_max, ...);


/****************************************************************
 *  函数功能:   动态数组占用资源清理
 *  输入参数:
 *          dynamic_array:  已经被初始化的动态数组结构指针
 *  输出参数:
 *          无
 *  返回值:
 *          成功返回0；
 *          失败返回小于0的错误码；
 ****************************************************************/
void dynamic_array_free(dynamic_array_t* dynamic_array);


/****************************************************************
 *  函数功能:   获取动态数组的状态信息
 *  输入参数:
 *          dynamic_array:  初始化完成的动态数组结构指针
 *  输出参数:
 *          无；动态数组的相关参数将打印到终端；
 *              比如申请了一个动态数组 demo[5][10]
 *              dynamic_array->mem_size:    申请的总空间大小（50）
 *              dynamic_array->max_dimension:   最大维度（2）
 *              dynamic_array->dimension[0] upper limit:    维度1的最大下标（5）
 *              dynamic_array->dimension[1] upper limit:    维度2的最大下标（10）
 *              ...
 *  返回值:
 *          成功返回0；
 *          失败返回小于0的错误码；
 ****************************************************************/
int print_dynamic_info(dynamic_array_t* dynamic_array);

/**
 *  函数功能:   获取该动态数组占用的空间大小
 *  输入参数: 
 *          动态数组结构指针
 *  输出参数：
 *          无；
 *  返回值:
 *          成功返回大于0的值；
 */
unsigned int get_mem_size(dynamic_array_t* dynamic_array);


#endif